/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.vse.adventura.po1715.xskrz00_skrivankova.gui;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;

import cz.pecinovsky.english.pojj.adv_framework.gui_stage.IGUI_04;
import cz.pecinovsky.english.pojj.adv_framework.gui_stage.IGUI_04_Pane;

import java.awt.Dimension;

import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.text.Document;



/*******************************************************************************
 * Instance třídy {@code OutputPane} představují oblasti GUI,
 * do nichž je zapisován text informující uživatele o průběhu hry.
 *
 * @author    Rudolf PECINOVSKÝ
 * @version   0.00.000
 */
@SuppressWarnings("serial")
public class OutputPane extends JScrollPane implements IGUI_04_Pane
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** GUI, které daný panel používá. */
    protected final IGUI_04 gui;

    /** Komponenta, do které je zapisován text
     *  informující uživatele o průběhu hry. */
    private final JEditorPane outputArea = new JEditorPane("text/html", "");

    /** Objekt určený pro postupné skládání jednotlivých odpovědí hry
     *  do jednoho souvislého textového řetězce. */
    private final StringBuilder stringBuilder = new StringBuilder();



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Aktuálně provozovaná hra. */
    private IGameG game;



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří vstupní panel, který bude používán v zadnaém GUI.
     *
     * @param gui         GUI, které bude daný panel používat
     * @param outputSize  Velikost oblasti vyhrazené pro tento panel
     */
    public OutputPane(IGUI_04 gui, Dimension outputSize)
    {
        this.gui = gui;
        outputArea.setEditable(false);

        setViewportView(outputArea);
        setPreferredSize(outputSize);
    }


//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Inicializuje oblast s vystupujícím textem.
     * Zde je potřeba při každém spuštění hry smazat
     * případný dříve vypsaný text, aby hra začala s čistou oblastí.
     */
    @Override
    public void initialize()
    {
        game = gui.getGame();
        outputArea.setText("");
        stringBuilder.setLength(0);
        stringBuilder.append("<html>");
    }


    /***************************************************************************
     * Aktualizuje oblast s vystupujícím textem, tj.
     * přečte si zadaný příkaz a zapíše jej do výstupní oblasti,
     * zjistí, jak na tento příkaz hra zareaguje
     * a zapíše její odpověď do výstupní oblasti.
     */
    @Override
    public void update()
    {
        String statement = gui.getCommand();
        stringBuilder.append("<hr><b><font Color=red>").
                      append(statement).
                      append("</font></b><br>");
        String answer = game.executeCommand(statement).
                             replaceAll("\n", "<br>");
        String outputText = stringBuilder.append(answer).append("<br><br>") +
                            "<html>";
        outputArea.setText(outputText);

        Document document = outputArea.getDocument();
        int caretPosition = document.getLength();
        outputArea.setCaretPosition(caretPosition);
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        BagPane_2 inst = new BagPane_2();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
